{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "initial_id",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    ""
   ]
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-04T02:42:32.593302Z",
     "start_time": "2025-08-04T02:42:25.401312Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# 1.导入相关包\n",
    "from langchain.chains import LLMChain\n",
    "\n",
    "import os\n",
    "import dotenv\n",
    "from langchain_community.chat_models import ChatOpenAI\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "dotenv.load_dotenv()  #加载当前目录下的 .env 文件\n",
    "\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "# 2.创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "chainA_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你是一位精通各领域知识的知名教授\"),\n",
    "        (\"human\", \"请你尽可能详细的解释一下：{knowledge}\"),\n",
    "    ]\n",
    ")\n",
    "chainA_chains = LLMChain(llm=llm,\n",
    "                         prompt=chainA_template,\n",
    "                         # verbose=True\n",
    "                        )\n",
    "\n",
    "chainA_chains.invoke({\"knowledge\":\"什么是LangChain？\"})"
   ],
   "id": "9fa89ac18f3aeaa3",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'knowledge': '什么是LangChain？',\n",
       " 'text': 'LangChain 是一个专为构建基于语言模型的应用程序而设计的框架。它旨在帮助开发者利用大型语言模型（如 OpenAI 的 GPT 系列、Google 的 BERT 等）构建更复杂和功能丰富的应用程序。LangChain 提供了一个模块化和可扩展的架构，使开发者能够轻松集成多种功能和服务，从而创建智能对话系统、文本生成工具、问答系统等。\\n\\n### LangChain 的核心组成部分\\n\\n1. **链（Chains）**：\\n   - LangChain 中的“链”是指将多个组件串联起来的过程，通常包括输入处理、语言模型调用和输出生成。开发者可以根据需求自定义链的结构，以实现特定的功能。\\n\\n2. **工具（Tools）**：\\n   - LangChain 支持集成外部工具，比如数据库、API 和其他服务。这使得模型可以在生成文本的同时访问实时信息，增强了回答的准确性和实用性。\\n\\n3. **内存（Memory）**：\\n   - LangChain 提供了内存管理功能，可以让应用程序记住用户的上下文信息，从而实现更自然的对话体验。例如，在多轮对话中，系统可以记住用户的偏好和历史交互。\\n\\n4. **文档加载器（Document Loaders）**：\\n   - LangChain 能够从不同的数据源（如文本文件、数据库、网页等）加载文档，并将其转换为适合语言模型处理的格式。这对构建知识库和进行信息检索非常有用。\\n\\n5. **模型选择（Model Selection）**：\\n   - LangChain 支持多种语言模型，开发者可以根据具体需求选择最合适的模型进行调用。同时，框架也提供了一些优化和调整的方法，以提高模型的性能。\\n\\n### LangChain 的应用场景\\n\\n- **聊天机器人**：通过构建具有上下文理解能力的聊天机器人，LangChain 可以用于客户服务、个人助理等场景。\\n- **文本生成**：可以用于创作、营销文案生成等任务，帮助用户快速生成高质量的文本内容。\\n- **问答系统**：结合知识库，LangChain 可以构建能够回答特定领域问题的系统，如医疗咨询、法律咨询等。\\n- **数据分析**：利用语言模型分析和解读数据，生成报告和见解。\\n\\n### 使用 LangChain 的优势\\n\\n1. **模块化和灵活性**：开发者可以根据自己的需求选择和组合不同的模块，快速构建所需的功能。\\n2. **简化开发流程**：提供了许多现成的组件和工具，减少了从零开始开发的复杂性。\\n3. **增强的用户体验**：通过内存和上下文管理，LangChain 可以提供更加个性化和人性化的交互体验。\\n\\n### 总结\\n\\nLangChain 是一个强大的框架，旨在促进基于语言模型的应用程序的开发。它的模块化设计和丰富的功能使得开发者能够更高效地构建复杂的系统，满足用户的多样化需求。随着大语言模型技术的不断进步，LangChain 可能会在更多领域和应用中发挥重要作用。'}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-04T02:43:41.701895Z",
     "start_time": "2025-08-04T02:43:30.930415Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "chainB_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你非常善于提取文本中的重要信息，并做出简短的总结\"),\n",
    "        (\"human\", \"这是针对一个提问完整的解释说明内容：{description}\"),\n",
    "        (\"human\", \"请你根据上述说明，尽可能简短的输出重要的结论，请控制在20个字以内\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "\n",
    "chainB_chains = LLMChain(llm=llm,\n",
    "                         prompt=chainB_template,\n",
    "                         # verbose=True\n",
    "                        )\n",
    "\n",
    "\n",
    "#\n",
    "# 导入SimpleSequentialChain\n",
    "from langchain.chains import SimpleSequentialChain\n",
    "\n",
    "# 在chains参数中，按顺序传入LLMChain A 和LLMChain B\n",
    "full_chain = SimpleSequentialChain(chains=[chainA_chains, chainB_chains], verbose=True)\n",
    "\n",
    "full_chain.invoke({\"input\":\"什么是langChain？\"})\n"
   ],
   "id": "8aa5d5d166554ab1",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3mLangChain 是一个开源框架，旨在简化和增强构建与大语言模型（LLM）交互的应用程序的过程。它特别关注如何将语言模型与其他工具和数据源结合起来，以实现更复杂的功能。LangChain 的设计目的是帮助开发者更容易地构建基于语言模型的应用，支持多种用例，如对话系统、问答系统、文本生成等。\n",
      "\n",
      "以下是 LangChain 的几个核心概念和功能：\n",
      "\n",
      "1. **链（Chains）**：\n",
      "   - LangChain 的核心概念之一是“链”。链是由多个组件组成的，可以将多个处理步骤串联起来。比如，你可以创建一个链，它首先从数据库中检索信息，然后将这些信息输入到语言模型中进行处理，最后将结果返回给用户。\n",
      "\n",
      "2. **提示（Prompts）**：\n",
      "   - 在与语言模型交互时，提示是输入信息的关键。LangChain 提供了工具来构建、管理和优化提示，使得开发者可以更灵活地控制语言模型的输出。\n",
      "\n",
      "3. **文档加载（Document Loaders）**：\n",
      "   - LangChain 支持从多种数据源加载文档，比如数据库、API、文件系统等。这使得用户能够轻松地从不同位置获取信息，并将其用于模型的输入。\n",
      "\n",
      "4. **记忆（Memory）**：\n",
      "   - LangChain 允许创建具有记忆功能的对话系统，使得模型能够在会话中保持上下文。这对于构建更自然和连贯的对话体验非常重要。\n",
      "\n",
      "5. **工具（Tools）**：\n",
      "   - LangChain 可以与外部工具集成，例如搜索引擎、API 调用等。这使得应用能够在与用户互动的同时，访问实时数据或执行特定任务。\n",
      "\n",
      "6. **代理（Agents）**：\n",
      "   - LangChain 支持代理的概念，这些代理可以根据用户的请求动态选择使用的工具或链。这为构建智能化的应用提供了可能。\n",
      "\n",
      "7. **支持多种模型**：\n",
      "   - LangChain 支持与多种语言模型的集成，包括 OpenAI 的 GPT 系列、Google 的 BERT、Anthropic 的 Claude 等。这种多样性使得开发者可以根据需求选择最合适的模型。\n",
      "\n",
      "8. **社区和生态系统**：\n",
      "   - LangChain 拥有活跃的开发者社区，提供了大量的文档、示例和扩展功能，帮助用户快速上手并解决问题。\n",
      "\n",
      "9. **可扩展性**：\n",
      "   - LangChain 设计为可扩展的框架，开发者可以根据自己的需求扩展已有的功能或创建新的组件。\n",
      "\n",
      "10. **用例**：\n",
      "    - LangChain 可用于多种应用场景，如聊天机器人、虚拟助手、信息检索系统、内容生成工具等。\n",
      "\n",
      "总体而言，LangChain 是一个强大的工具，旨在提升开发者与语言模型交互的灵活性和效率，使得构建智能应用变得更加高效和便捷。通过将不同的功能模块化，LangChain 使得开发者可以专注于业务逻辑，而不是底层技术细节。\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3mLangChain 简化构建与语言模型交互的应用，支持多种功能和用例。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'input': '什么是langChain？', 'output': 'LangChain 简化构建与语言模型交互的应用，支持多种功能和用例。'}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-04T02:45:05.563157Z",
     "start_time": "2025-08-04T02:44:49.901217Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1.导入相关包\n",
    "from langchain.chains import LLMChain\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SimpleSequentialChain\n",
    "\n",
    "# 2.创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 3.定义一个给剧名写大纲的LLMChain\n",
    "template1 = \"\"\"你是个剧作家。给定剧本的标题，你的工作就是为这个标题写一个大纲。\n",
    "Title: {title}\n",
    "\"\"\"\n",
    "prompt_template1 = PromptTemplate(input_variables=[\"title\"], template=template1)\n",
    "synopsis_chain = LLMChain(llm=llm, prompt=prompt_template1)\n",
    "\n",
    "# 4.定义给一个剧本大纲写一篇评论的LLMChain\n",
    "template2 = \"\"\"你是《纽约时报》的剧评家。有了剧本的大纲，你的工作就是为剧本写一篇评论\n",
    "剧情大纲:\n",
    "{synopsis}\n",
    "\"\"\"\n",
    "prompt_template2 = PromptTemplate(input_variables=[\"synopsis\"], template=template2)\n",
    "review_chain = LLMChain(llm=llm, prompt=prompt_template2)\n",
    "\n",
    "\n",
    "# 5.定义一个完整的链按顺序运行这两条链\n",
    "#(verbose=True:打印链的执行过程)\n",
    "overall_chain = SimpleSequentialChain(\n",
    "    chains=[synopsis_chain, review_chain], verbose=True\n",
    ")\n",
    "# 6.调用完整链顺序执行这两个链\n",
    "review = overall_chain.invoke(\"日落海滩上的悲剧\")\n",
    "\n",
    "# 7.打印结果\n",
    "\n",
    "\n",
    "\n",
    "print(review)"
   ],
   "id": "f210bae7d429482c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3m**剧本大纲：《日落海滩上的悲剧》**\n",
      "\n",
      "**第一幕：引子**\n",
      "\n",
      "- **场景设定**：故事发生在一个风景如画的海滩小镇，阳光洒在金色的沙滩上，海浪轻轻拍打着岸边，日落时分，天空染上了橘红色的光辉。\n",
      "- **角色介绍**：\n",
      "  - **李明**：一位年轻的冲浪教练，热爱海洋，性格开朗，拥有一段痛苦的过去。\n",
      "  - **小雪**：李明的青梅竹马，刚刚从城市回到小镇，梦想成为一名摄影师。\n",
      "  - **阿强**：李明的好友，性格幽默，常常调侃李明和小雪之间的情感。\n",
      "  - **莉莉**：小镇上的富家女，外表温柔，但内心复杂，对李明抱有暗恋之情。\n",
      "\n",
      "**第二幕：冲突的萌芽**\n",
      "\n",
      "- **情感纠葛**：小雪回到小镇后，李明对她的感情重新燃起，两人开始频繁相处。莉莉对李明的追求变得愈加明显，尝试通过各种方式吸引他的注意。\n",
      "- **过去的阴影**：李明在一次冲浪比赛中失去了自己的弟弟，这段记忆时常困扰着他。他对海洋既热爱又恐惧，内心深处对自己的自责感不断加剧。\n",
      "- **意外的发生**：阿强为了帮助李明和小雪，策划了一场海滩聚会，然而在聚会上，一场突如其来的风暴袭来，聚会被迫结束，造成了混乱。\n",
      "\n",
      "**第三幕：悲剧的降临**\n",
      "\n",
      "- **灾难**：风暴过后，李明和小雪决定去海滩救助被困的人。过程中，阿强不幸被巨浪卷走，李明在救阿强时又陷入了对过去的恐惧中，最终未能成功救回阿强。\n",
      "- **内心的挣扎**：李明深感自责，认为自己是导致阿强死亡的原因，而小雪则努力安慰他，但李明的内心已经被阴影笼罩。他与小雪的关系也因此变得紧张。\n",
      "- **莉莉的介入**：莉莉试图利用李明的脆弱，向他倾诉自己对他的爱慕，希望能够填补他内心的空缺，却被李明拒绝。\n",
      "\n",
      "**第四幕：解脱与重生**\n",
      "\n",
      "- **面对过去**：在小镇的哀悼仪式上，李明终于面对了自己的内心，接受了阿强的死是无法改变的事实，并意识到他不能再让过去的阴影主宰自己的生活。\n",
      "- **情感的选择**：小雪在李明身边默默支持，李明开始重新审视与小雪的感情，他们之间的联系愈加坚定。莉莉则选择离开小镇，追寻自己的生活。\n",
      "- **新的开始**：在一个日落的傍晚，李明再次站在海滩上，决定重新开始自己的冲浪教练生涯，并与小雪共同开启他们的梦想。\n",
      "\n",
      "**尾声：希望的曙光**\n",
      "\n",
      "- **结尾画面**：日落的海滩上，李明与小雪并肩而立，海浪轻柔地拍打着岸边，未来的希望在他们的眼中闪烁。李明最终理解了生活的意义，学会了珍惜眼前的一切。\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3m**剧评：《日落海滩上的悲剧》**\n",
      "\n",
      "在这部新剧《日落海滩上的悲剧》中，编剧成功地将青春的悸动与人生的沉重交织在一起，透过一个风景如画的小镇，描绘出生命的脆弱与希望的曙光。故事围绕着李明、小雪、阿强与莉莉之间错综复杂的情感关系，展现了在面对失去与内心挣扎时，他们如何找到自我救赎的旅程。\n",
      "\n",
      "**一幕的引子**以美丽的海滩和温暖的日落开启，观众仿佛能够感受到海风的轻拂与沙滩的细腻。李明作为一个热情洋溢的冲浪教练，承载着对海洋的热爱与深深的痛苦。小雪的回归则是一种甜蜜的召唤，唤醒了李明心中久违的情感。然而，莉莉的暗恋和阿强的调侃为这段关系投下了一层复杂的阴影，构建了紧张的情感基调。\n",
      "\n",
      "随着剧情的发展，**第二幕**中情感纠葛的逐渐加深，李明与小雪之间的甜蜜互动与莉莉的强烈追求形成了鲜明的对比。此时，编剧巧妙地引入了李明对过去的阴影，这种内心的挣扎不仅增加了角色的深度，也让观众感受到他的脆弱与无助。阿强的角色则在轻松幽默中增添了几分温暖，然而他的命运在风暴来临时戛然而止，带来了不可逆转的悲剧。\n",
      "\n",
      "**第三幕**是故事的高潮，风暴的来临象征着命运的无情。李明在救援中再次面对失去弟弟的恐惧，展现了人性在危机时刻的脆弱。阿强的死不仅是对李明造成的沉重打击，也让小雪与李明的关系陷入了困境。此时，莉莉的介入如同火上浇油，她试图填补李明心中的空缺，却不知这样的行为只会加深他的痛苦。这一幕让人痛心，也让观众反思：在面对悲剧时，爱与关怀的表达方式是多么重要。\n",
      "\n",
      "在**第四幕**中，李明终于走出阴影，面对自己的内心，接受了不可改变的事实。编剧在这一幕中展现了人性中最为光辉的一面，李明与小雪的情感得以升华，莉莉的选择则显得更加成熟与理智。这种情感的选择不仅是对过往的告别，更是一种对未来的希冀，传达出生活的希望与重生的可能。\n",
      "\n",
      "最后，**尾声**的画面如同一幅美丽的油画，日落的海滩上，李明与小雪并肩而立，象征着他们共同迎接未来的勇气。编剧通过这一幕完美地呼应了整部剧的主题：面对悲剧与失去，唯有珍惜眼前、勇敢前行，才能找到生活的意义。\n",
      "\n",
      "总的来说，《日落海滩上的悲剧》是一部触动人心的作品，展现了青春、爱情、失去与希望之间的辩证关系。剧中角色的成长与转变让人感同身受，海滩的美丽与悲剧的深邃形成鲜明对比，令人回味无穷。这部剧不仅仅是对悲剧的描绘，更是对生命意义的深刻思考，值得每位观众细细品味。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '日落海滩上的悲剧', 'output': '**剧评：《日落海滩上的悲剧》**\\n\\n在这部新剧《日落海滩上的悲剧》中，编剧成功地将青春的悸动与人生的沉重交织在一起，透过一个风景如画的小镇，描绘出生命的脆弱与希望的曙光。故事围绕着李明、小雪、阿强与莉莉之间错综复杂的情感关系，展现了在面对失去与内心挣扎时，他们如何找到自我救赎的旅程。\\n\\n**一幕的引子**以美丽的海滩和温暖的日落开启，观众仿佛能够感受到海风的轻拂与沙滩的细腻。李明作为一个热情洋溢的冲浪教练，承载着对海洋的热爱与深深的痛苦。小雪的回归则是一种甜蜜的召唤，唤醒了李明心中久违的情感。然而，莉莉的暗恋和阿强的调侃为这段关系投下了一层复杂的阴影，构建了紧张的情感基调。\\n\\n随着剧情的发展，**第二幕**中情感纠葛的逐渐加深，李明与小雪之间的甜蜜互动与莉莉的强烈追求形成了鲜明的对比。此时，编剧巧妙地引入了李明对过去的阴影，这种内心的挣扎不仅增加了角色的深度，也让观众感受到他的脆弱与无助。阿强的角色则在轻松幽默中增添了几分温暖，然而他的命运在风暴来临时戛然而止，带来了不可逆转的悲剧。\\n\\n**第三幕**是故事的高潮，风暴的来临象征着命运的无情。李明在救援中再次面对失去弟弟的恐惧，展现了人性在危机时刻的脆弱。阿强的死不仅是对李明造成的沉重打击，也让小雪与李明的关系陷入了困境。此时，莉莉的介入如同火上浇油，她试图填补李明心中的空缺，却不知这样的行为只会加深他的痛苦。这一幕让人痛心，也让观众反思：在面对悲剧时，爱与关怀的表达方式是多么重要。\\n\\n在**第四幕**中，李明终于走出阴影，面对自己的内心，接受了不可改变的事实。编剧在这一幕中展现了人性中最为光辉的一面，李明与小雪的情感得以升华，莉莉的选择则显得更加成熟与理智。这种情感的选择不仅是对过往的告别，更是一种对未来的希冀，传达出生活的希望与重生的可能。\\n\\n最后，**尾声**的画面如同一幅美丽的油画，日落的海滩上，李明与小雪并肩而立，象征着他们共同迎接未来的勇气。编剧通过这一幕完美地呼应了整部剧的主题：面对悲剧与失去，唯有珍惜眼前、勇敢前行，才能找到生活的意义。\\n\\n总的来说，《日落海滩上的悲剧》是一部触动人心的作品，展现了青春、爱情、失去与希望之间的辩证关系。剧中角色的成长与转变让人感同身受，海滩的美丽与悲剧的深邃形成鲜明对比，令人回味无穷。这部剧不仅仅是对悲剧的描绘，更是对生命意义的深刻思考，值得每位观众细细品味。'}\n"
     ]
    }
   ],
   "execution_count": 6
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
